package kr.co.bettersoft.waitnumbercustomer.activity;

import kr.co.bettersoft.waitnumbercustomer.common.CommonConstant;
import kr.co.bettersoft.waitnumbercustomer.common.WaitNumberCustomerRest;
import kr.co.bettersoft.waitnumbercustomer.domain.MemberUser;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
/**
 * CertificationStep2
 * 인증 2화면 - 사용자 인증
 * 
 * 전화번호를 보내 승인번호를 받고,
 *  전화번호와 승인번호로 승인을 받는다.
 *  
 */
public class CertificationStep2 extends Activity{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 변수
	
	String TAG = "CertificationStep2";

	public final int CERTIFICATION_STEP1 = 101; // 로그인한다
	public final int CERTIFICATION_STEP2 = 102; // 로그인한다
	
	// 폰트
	private Typeface typefaceNanumGothic= null; 
	private Typeface typefaceNanumGothicBold = null;
	
	String phoneNum = "";
	String tempPhoneNum = "";	// 승인번호를 요청한 전화번호. 승인번호 요청 이후 전화번호 바꾸는것 방지하기 위하여 비교
	Boolean certified = false;	
	// 설정 파일 저장소  --> QR 코드도 저장하는걸로..
	SharedPreferences sharedPrefCustom;		// WaitNumCustomePref
	
	// 서버 통신
//	String certiResult="";
//	WaitNumberCustomerRest waitNumberCustomerRest;
//	String callResult = "";
//	String tempstr = "";
//	JSONObject jsonObject;
	
	
	// 화면 구성
	TextView titleBar;		// 타이틀
	Button requestCertiNumBtn, certiNumConfirmBtn;	// 인증번호 요청 버튼, 인증 버튼
	EditText userPhoneNumber, userCertiNumber;			// 사용자 전화번호 입력창 , 인증번호 입력창
	ProgressBar pb1;		// 중단 로딩 진행바
	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;		// 키보드 제어
    
/////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			Bundle b = msg.getData();
			try{
				if(b.getInt("showErrToast")==1){
					Toast.makeText(CertificationStep2.this,b.getString("msg"), Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showAlert")==1){					 // 알림 및 경고창 . 
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		// 경고창.  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("showAlert")==2){					 // 인증 성공 
					// 토스트만 띄우고 바로 패스한다.
					Toast.makeText(CertificationStep2.this,b.getString("msg"), Toast.LENGTH_SHORT).show();
					Intent intent = new Intent(CertificationStep2.this, IntroActivity.class);	
					startActivity(intent);   
					finish();
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.certi_progressbar2);
					}
					pb1.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					if(pb1==null){
						pb1=(ProgressBar) findViewById(R.id.certi_progressbar2);
					}
					pb1.setVisibility(View.INVISIBLE);
				}
				
				switch (msg.what)
				{
					case CERTIFICATION_STEP1 : runOnUiThread(new RunnableCertificationStep1());
						break;
					case CERTIFICATION_STEP2 : runOnUiThread(new RunnableCertificationStep2());
						break;
					default : 
						break;
				}

				
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};
	
	
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );
		setContentView(R.layout.certification_step2_activity);
		
		
		
		titleBar = (TextView) findViewById(R.id.title_bar);
		requestCertiNumBtn = (Button) findViewById(R.id.requestCertiNumBtn);	// 인증번호 요청 버튼
		certiNumConfirmBtn = (Button) findViewById(R.id.certiNumConfirmBtn);	// 인증 버튼
		userPhoneNumber = (EditText)findViewById(R.id.userPhoneNumber);		// 전화번호 입력창
		userCertiNumber = (EditText)findViewById(R.id.userCertiNumber);		// 인증번호 입력창
		
		// 폰트 지정.
	    typefaceNanumGothic = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothic);  
	    typefaceNanumGothicBold = Typeface.createFromAsset(getAssets(), CommonConstant.NanumGothicBold);
		// 폰트 적용
	    titleBar.setTypeface(typefaceNanumGothic);
	    userPhoneNumber.setTypeface(typefaceNanumGothic);	
	    userCertiNumber.setTypeface(typefaceNanumGothic);		
	    requestCertiNumBtn.setTypeface(typefaceNanumGothicBold);
	    certiNumConfirmBtn.setTypeface(typefaceNanumGothicBold);
	    
	    
		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도 
		parentLayout = findViewById(R.id.certi_step2_parent_layout);		
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				hideKeyboard();
			}
		});
		
		// prefs
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		
		userPhoneNumber.setText(phoneNum);
		
		requestCertiNumBtn.setText(R.string.certi_step1_btn1);			// 다국어 지원.
		
		// 서버로 전화번호를 보내서 인증번호를 요청한다.
		requestCertiNumBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				hideKeyboard();
				tempPhoneNum = userPhoneNumber.getText()+"";
				if(tempPhoneNum.length()>0){
					try {
						handler.sendEmptyMessage(CERTIFICATION_STEP1);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}else{		// 전번없음
					showResultDialog(getString(R.string.no_phone_num));
				}
			}
		});
		// 인증버튼. 인증번호를 가지고 서버에 인증 절차를 밟는다.
		certiNumConfirmBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				hideKeyboard();
				phoneNum = userPhoneNumber.getText()+"";
				if(phoneNum.length()<1){
					showResultDialog(getString(R.string.no_phone_num));		
				}else if((userCertiNumber.getText()+"").length()!=4){
					showResultDialog(getString(R.string.input_certi_4nums));		// 승인번호 4자리를 입력해주세요. 
				}else if(!(phoneNum.equals(tempPhoneNum))){		// 승인 요청 이후 전번을 바꿨다면 이렇게.. 다시 승인 요청하도록. 
					showResultDialog(getString(R.string.certi_no_certi_num_with_that_phone_num));
				}else{
					// 서버로 인증번호를 보내서 인증번호를 확인한다.
					try {
//						 // 인증 2단계.		  
						handler.sendEmptyMessage(CERTIFICATION_STEP2);
					} catch (Exception e) {
						e.printStackTrace();
					} 
				}
			}
		});
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public void userCertifiedComplete1(){	
		// 서버에 저장 후 pref 에 저장 
		new backgroundThreadRegisterMemberToServer().execute();
	}
	//  pref 에 저장후 다음 단계로 진행.
	public void userCertifiedComplete2(){
		// 인증 완료 후 작업
		SharedPreferences.Editor updateDone =   sharedPrefCustom.edit();
		if(phoneNum.length()>0){
			updateDone.putString("agreedYN", "Y");			// 인증 여부 저장
			updateDone.putString("phoneNum", phoneNum);		// 전번도 저장	 
			updateDone.putString("qrCode", phoneNum);		// qrCode = phoneNum 
		}
		updateDone.commit();
		showResultDialog2(getString(R.string.certi_success));	// 인증 성공 메시지를 띄우고 바로 다음 화면으로
		certified = true;		
	}
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	
	
	/**
	 * 러너블. 인증 1단계 수행. 인증번호 요청
	 */
	class RunnableCertificationStep1 implements Runnable {
		public void run(){
			new backgroundThreadCertificationStep1().execute();
		}
	}
	/**
	 * backgroundThreadCertificationStep1
	 * 비동기    서버와 통신하여 서버와 통신하여 인증 1단계 수행. 인증번호 요청
	 * @author blue
	 *
	 */
	public class backgroundThreadCertificationStep1 extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadCertificationStep1");
			
			// 파라미터 세팅
			MemberUser memberUserParam = new MemberUser();
			memberUserParam.setPhoneNumber(userPhoneNumber.getText()+"");	
			// 서버 메소드 호출
			showPb();
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult = waitNumberCustomerRest.RestCertificationStep_1(memberUserParam);
			hidePb();
			// 결과 처리
			if(callResult.equals("SUCCESS")){				// 인증번호 요청 성공
				showResultDialog(getString(R.string.certi_num_req_success));	
			}else{														// 인증번호 요청 실패
				showResultDialog(getString(R.string.certi_num_req_fail));
			}
			return null; 
		}
	}
	
	/**
	 * 러너블. 인증2단계 수행.
	 */
	class RunnableCertificationStep2 implements Runnable {
		public void run(){
			new backgroundThreadCertificationStep2().execute();
		}
	}
	/**
	 * backgroundThreadCertificationStep2
	 * 비동기     서버와 통신하여 인증2단계 수행.
	 * @author blue
	 *
	 */
	public class backgroundThreadCertificationStep2 extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadCertificationStep2");
			
			// 파라미터 세팅
			MemberUser memberUserParam = new MemberUser();
			memberUserParam.setPhoneNumber(userPhoneNumber.getText()+"");	// 전번
			memberUserParam.setCertiNum(userCertiNumber.getText()+"");	// 승인번호
			phoneNum = userPhoneNumber.getText()+"";	// 성공 했을때에 사용하기 위해 미리 저장해둔다.
			// 서버 메소드 호출
			showPb();
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult = waitNumberCustomerRest.RestCertificationStep_2(memberUserParam);
			hidePb();
			// 결과 처리
			
			if(callResult.equals("SUCCESS_ADMISSION")){				// 인증 성공		, 등록 필요.
				Log.i(TAG, "SUCCESS_ADMISSION");
				new backgroundThreadUserRegisterCheck().execute();
			}else{														// 인증 실패
				Log.i(TAG, "FAIL_ADMISSION");
				hidePb();
				showResultDialog(getString(R.string.certi_fail));
			}
			return null; 
		}
	}
	
	
	/**
	 * backgroundThreadUserRegisterCheck
	 * 비동기  . 서버에 저장되어 있는지 확인.  저장되어 있으면 프립에만 저장 후 통과. 저장되어 있지 않으면 서버에 저장 후 프립에 저장 후 통과
	 * @author blue
	 *
	 */
	public class backgroundThreadUserRegisterCheck extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadUserRegisterCheck");
			
			// 파라미터 세팅
			MemberUser memberUserParam = new MemberUser();
			memberUserParam.setPhoneNumber(phoneNum);	// 전번
			// 서버 메소드 호출
			showPb();
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult = waitNumberCustomerRest.RestUserRegisterCheck(memberUserParam);
			hidePb();
			// 결과 처리
			if(!(callResult.equals("F"))){				 
				try {
					JSONObject jsonObject = new JSONObject(callResult);
					// 데이터를 전역 변수 도메인에 저장하고 핸들러를 통해 도메인-> 화면에 보여준다..
					try{
						callResult = (jsonObject.getString("totalCount"));				// 등록여부
					}catch(Exception e){
						callResult = "1";
						alertMsg();
					}
					if(callResult.equals("0")){
						Log.d(TAG,"Need to reg");
						userCertifiedComplete1();		// 서버 및 설정에 저장 후 다음 단계로.
					}else{
						Log.d(TAG,"Need not reg");
						userCertifiedComplete2();		// 서버저장 생략하고, 설정에만 저장 후 다음 단계로.	
					}
				} catch (JSONException e) {
					e.printStackTrace();
					alertMsg();
				} 
			}else{														// 인증 실패
				Log.i(TAG, "FAIL_ADMISSION");
				showResultDialog(getString(R.string.certi_fail));
			}
			return null; 
		}
	}
	
	
	/**
	 * backgroundThreadRegisterMemberToServer
	 * 비동기  . 서버에 멤버 가입 한다.
	 * @author blue
	 *
	 */
	public class backgroundThreadRegisterMemberToServer extends AsyncTask<Void, Void, Void>{
		@Override protected void onPostExecute(Void result) {  
		} 
		@Override protected void onPreExecute() {  
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadRegisterMemberToServer");
			
			// 파라미터 세팅
			MemberUser memberUserParam = new MemberUser();
			memberUserParam.setPhoneNumber(phoneNum);	// 전번
			// 서버 메소드 호출
			showPb();
			WaitNumberCustomerRest waitNumberCustomerRest = new WaitNumberCustomerRest();
			String callResult = waitNumberCustomerRest.RestRegisterMemberToServer(memberUserParam);
			hidePb();
			// 결과 처리
			if(callResult.equals("SUCCESS")){
				Log.d(TAG,"S to register to Server. now save id to pref and go next step.");
				userCertifiedComplete2();
			}else{
				alertMsg();
			}
			return null; 
		}
	}
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
// 유틸	

	public void alertMsg(){			// 인증 실패 메시지
		CertificationStep2.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();
				Bundle b = new Bundle();
				String alrtMsg = getString(R.string.certi_fail_msg);
				b.putInt("showErrToast", 1);
				b.putString("msg", alrtMsg);			
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	
	public Context returnThis(){
		return this;
	}
	/**
	 * showResultDialog
	 * 토스트를 얼럿으로 바꾼다.
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showResultDialog(final String msg){
		CertificationStep2.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 1);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	// 인증 확인 토스트를 띄우고  다음 화면으로.
	public void showResultDialog2(final String msg){
		CertificationStep2.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("showAlert", 2);
				b.putString("msg", msg);			// 화면에 보여줄 메시지
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	}
	
	/**
	 * hideKeyboard
	 * 키보드 숨긴다
	 *
	 * @param 
	 * @param 
	 * @return nowTime
	 */
	public void hideKeyboard(){
		imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE );
		imm .hideSoftInputFromWindow(userCertiNumber.getWindowToken(), 0);
	}

	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		CertificationStep2.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 1);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		CertificationStep2.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler .obtainMessage();
				Bundle b = new Bundle();
				b.putInt( "order" , 2);
				message.setData(b);
				handler .sendMessage(message);
			}
		});
	}
	
}
